export default class SocketService {
    // 单例设计模式
    static instance = null
    static get Instance() {
        if (!this.instance) {
            this.instance = new SocketService()
        }
        return this.instance
    }

    // 与服务器连接的socket对象
    ws = null
    // 定义回调函数存储
    callBackMapping = {}
    // 连接成功标识
    connected = false
    // 发送数据请求重试次数标识
    sendRetry = 0
    // 连接请求重试次数
    connectRetry = 0
    // 定义连接服务器的方法
    connect() {
        if (!window.WebSocket) {
            return console.log('不支持ws');
        }
        this.ws = new WebSocket('ws://localhost:9998')
        // 连接服务器成功事件
        this.ws.onopen = () => {
            this.connected = true
            console.log('connect successfully');
            this.connectRetry = 0
        }

        // 连接服务器失败事件、断开服务器连接事件
        this.ws.onclose = () => {
            console.log('connect falied');
            console.log('connect retry');
            this.connectRetry++
            setTimeout(() => {
                this.connect()
            }, 500 * this.connectRetry)
        }

        // 接受服务器传来的数据
        this.ws.onmessage = (msg) => {
            // 真正传过来的数据在data配置项
            const recvData = JSON.parse(msg.data)
            // 获取该次数据的socketType类型
            const socketType = recvData.socketType
            // 查看是否已经存储了对应注册函数
            if (this.callBackMapping[socketType]) {
                // 获取该次数据的操作类型
                const action = recvData.action
                if (action === 'getData') {
                    // 如果是获取数据，则需要解析出data配置项中的数据，并调用回调函数
                    const realData = JSON.parse(recvData.data)
                    this.callBackMapping[socketType].call(this, realData)
                }
                // 如果是其他两种，按照规定无data配置，直接利用该数据即可
                else if (action == 'fullScreen') {
                    console.log('调用函数', this.callBackMapping[socketType]);
                    this.callBackMapping[socketType].call(this, recvData)
                }
                else if (action == 'themeChange') {
                    this.callBackMapping[socketType].call(this, recvData)
                }
            }
        }
    }
    // 存储注册函数
    registerCallBack(socketType, callBack) {
        if (!this.callBackMapping[socketType]) {
            this.callBackMapping[socketType] = callBack
        }
    }
    // 清空注册回调函数
    unregisterCallBack(socketType) {
        this.callBackMapping[socketType] = null
    }
    // 定义发送数据给服务端函数，需要转成json格式
    send(data) {
        if (this.connected) {
            this.sendRetry = 0
            this.ws.send(JSON.stringify(data))
        }
        else {
            this.sendRetry++
            setTimeout(() => {
                this.send(data)
            }, 500 * this.sendRetry);
        }
    }
}
